package package03章_流程控制语句;

import java.util.Scanner;

/*
循环结构之一：while循环


1. 凡是循环结构，就一定会有4个要素：
① 初始化条件
② 循环条件 ---> 一定是boolean类型的变量或表达式
③ 循环体
④ 迭代部分

2.while的格式

①
while(②){
	③
	④
}

3.执行过程：① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

4. for循环与while循环可以相互转换！

5. for循环和while循环的小区别：初始化条件的作用域范围不同。while循环中的初始化条件在while循环结束后，依然有效。
*/
public class c_3_9WhileTest {
    public static void main(String[] args) {
        //需求1：遍历50次HelloWorld
        int i = 1;
        while (i <= 50) {
            System.out.println("HelloWorld");
            i++;//一定要小心！不要丢了
        }


        //需求2：遍历1-100以内的偶数，并获取偶数的个数，获取所有的偶数的和
        int j = 1;

        int count = 0;//记录偶数的个数
        int sum = 0;//记录偶数的总和
        while (j <= 100) {
            if (j % 2 == 0) {
                System.out.println(j);
                count++;
                sum += j;
            }
            j++;
        }
        System.out.println("偶数的个数为：" + count);
        System.out.println("偶数的总和为：" + sum);


        System.out.println("=================whileTest2=====================");

//        c_3_9WhileTest.whileTest1();

        System.out.println("=================whileTest2=====================");

//        c_3_9WhileTest.WhileTest2();

        System.out.println("=================ForWhileTest=====================");
//      c_3_9WhileTest.ForWhileTest();

        System.out.println("=================ForWhileTest2=====================");
        c_3_9WhileTest.ForWhileTest2();
    }


    /*
随机生成一个100以内的数，猜这个随机数是多少？

从键盘输入数，如果大了，提示大了；如果小了，提示小了；如果对了，就不再猜了，并统计一共猜了多少次。

提示：生成一个[a,b] 范围的随机数的方式：(int)(Math.random() * (b - a + 1) + a)
*/

    static void whileTest1() {
        //1. 生成一个[1,100]范围的随机整数
        int random = (int) (Math.random() * 100) + 1;

        //2. 使用Scanner，从键盘获取数据
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入1-100范围的一个整数：");
        int guess = scan.nextInt();

        //3.声明一个变量，记录猜的次数
        int guessCount = 1;

        //4. 使用循环结构，进行多次循环的对比和获取数据
        while (random != guess) {
            if (guess > random) {
                System.out.println("你输入的数据大了");

            } else if (guess < random) {
                System.out.println("你输入的数据小了");
            } else {
                break;
            }

            System.out.print("请输入1-100范围的一个整数：");
            guess = scan.nextInt();
            guessCount++;
        }


        //能结束结束，就意味着random和guess相等了
        System.out.println("恭喜你！猜对了！");
        System.out.println("共猜了" + guessCount + "次");


        scan.close();
    }


    static void WhileTest2() {
/*
世界最高山峰是珠穆朗玛峰，它的高度是8848.86米，假如我有一张足够大的纸，它的厚度是0.1毫米。
请问，我折叠多少次，可以折成珠穆朗玛峰的高度?

*/
        //1. 声明珠峰的高度、纸的默认厚度
        double paper = 0.1;//单位：毫米
        double zf = 8848860;//单位：毫米

        //2. 定义一个变量，记录折纸的次数
        int count = 0;

        //3. 通过循环结构，不断调整纸的厚度 （当纸的厚度超过珠峰高度时，停止循环）
        while (paper <= zf) {

            paper *= 2;
            count++;

        }

        System.out.println("paper的高度为:" + (paper / 1000) + ",超过了珠峰的高度" + (zf / 1000));
        System.out.println("共折纸" + count + "次");
    }


    /*

    "无限"循环结构的使用

    1. 格式： while(true)  或  for(;;)

    2.开发中，有时并不确定需要循环多少次，需要根据循环体内部某些条件，来控制循环的结束（使用break）。

    3. 如果此循环结构不能终止，则构成了死循环！开发中要避免出现死循环。
    */
    static void ForWhileTest() {

	/*
		for(;;){//while(true){
			System.out.println("I love you!");
		}
		*/

        //死循环的后面不能有执行语句。
        //System.out.println("end");
    }


    /*
案例：从键盘读入个数不确定的整数，并判断读入的正数和负数的个数，输入为0时结束程序。

*/
    static void ForWhileTest2() {
        Scanner scan = new Scanner(System.in);
        int positiveCount = 0;//记录正数的个数
        int negativeCount = 0;//记录负数的个数

        for (; ; ) {
            System.out.println("请输入一个整数(输入为0时结束程序)：");
            int num = scan.nextInt(); //获取用户输入的整数

            if (num > 0) { // 正数
                positiveCount++;
            } else if (num < 0) { //负数
                negativeCount++;
            } else { //零
                System.out.println("程序结束");
                break;
            }
        }

        System.out.println("正数的个数为：" + positiveCount);
        System.out.println("负数的个数为：" + negativeCount);


        scan.close();
    }
}
